#coding:utf-8
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from urllib.parse import quote
from pyquery import PyQuery as pq
from pymongo import MongoClient
import time
'''
    功能：获取淘宝搜索的商品数据
'''


def save_to_mongo(product):
    '''
        作用：保存到mongodb
        product:商品信息
    '''
    try:
        if collection.insert(product):
            print('存储到mongo成功')
    except Exception:
        print('存储到mongo失败')



def load_page(page):
    '''
        作用：抓取页面
        page:页面页码
    '''
    print('正在抓取第', page, '页')
    try:
        
        url = 'https://s.taobao.com/search?q=' + quote(keyword)
        browser.get(url)
        if page > 1:
            #页码输入框
            input = wait.until(
                EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager div.form > input'))
            )
            #页码确定按钮
            submit = wait.until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager div.form > span.btn.J_Submit'))
            )
            #清空输入框值
            input.clear()
            #输入新的页码值
            input.send_keys(page)
            #点击确定按钮
            submit.click()

        #等待页面元素加载，并判断其text是否跟所示参数(page)相符合：符合则继续执行
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager li.item.active > span'), str(page)))
        print('页码获取正确，为：', page)
        #等待页面元素加载完成
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.m-itemlist .items .item')))
        print('页面商品元素加载完成。。。')
        get_products()
    except TimeoutException:
        load_page(page)

def get_products():
    '''
        作用：提取商品数据
    '''
    html = browser.page_source
    doc = pq(html)
    items = doc('#mainsrp-itemlist .items .item').items()
    for item in items:
        product = {
            'image':item.find('.pic .img').attr('data-src'),
            'price':item.find('.price').text(),
            'deal':item.find('.deal-cnt').text(),
            'title':item.find('.shop').text(),
            'location':item.find('.location').text()
        }
        print(product)
        save_to_mongo(product)

if __name__ == '__main__':
    #selenium 初始化
    
    #以下代码可实现无界面浏览器模式（chrome版本 > 59）
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--headless')
    #可以设置是否缓存或者图片是否加载，来提高爬取速率
    service_args = ['--load-images=false', '--disk-cache=true']
    browser = webdriver.Chrome(chrome_options=chrome_options, service_args=service_args)

    #注释代码为显示浏览器界面模式
    #browser = webdriver.Chrome()

    #设置webdriver等待时间
    wait = WebDriverWait(browser, 10)

    #keyword设置
    keyword = str(input('请输入要搜索的商品：'))
    if not keyword:
        keyword = 'python'
    #mongo client
    client = MongoClient(host='localhost', port=27017)
    db = client['taobao']
    collection = db[keyword]
    #循环获取100页内的数据
    for i in range(1, 100):
        load_page(i)
        time.sleep(1)
